<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>设计模式——代理模式</title>
    <script type="application/javascript" charset="UTF-8" src="../../common/CommonUtils.js"></script>
    <script type="application/javascript" charset="UTF-8" >
        // 代理模式(proxy) ：代理 也是对象，就是为了节制(控制)对本体对象的访问
        // 本体对象，如果在页面加载的时候实例化，会消耗大量浏览器内存
        // 使用代理模式后，页面加载时，只需要实例化代理对象
        // 当具体使用到方法的时候，才去实例化本体对象
        // 需要注意的是：1、具体的实现还是本体对象 2、代理对象和本体对象都实现了相同的接口

        // 模拟图书馆的一个场景

        // 实例化一个图书馆的接口，本体对象和代理对象都要实现该接口
        var LibraryInterface = new WL.Interface(LibraryInterface,['addBook','findBook','checkoutBook','returnBook']);

        // 图书类
        var Book = function (id, title, author) {
            this.id = id;
            this.title = title;
            this.author = author;
        };

        // 图书馆类
        var Library = function (book) {
            this.book = book;
        };

        // 图书馆类实现接口方法
        Library.prototype = {
            // 还原构造器
            constructor : Library,
            addBook : function (book) {
                this.book[book.id] = book;
            },
            findBook : function (id) {
                if (this.book[id]) {
                    return this.book[id];
                }
                return null;
            },
            checkoutBook : function (id) {
                return this.findBook(id);
            },
            returnBook : function (book) {
                this.addBook(book);
            }
        };

        // 代理对象类
        var LibraryProxy = function (book) {
            this.book = book;
            this.library = null;
        };

        // 代理对象类实现接口
        LibraryProxy.prototype = {
            // 还原构造器
            constructor : LibraryProxy,
            // 初始化函数
            initializeLibrary : function () {
                // 如果代理对象中不存在本体对象，就实例化本体对象
                if (this.library == null) {
                    this.library = new Library(this.book);
                }
            },
            addBook : function (book) {
                // 在调用方法之前，先初始化代理对象，即实例化本体对象
                this.initializeLibrary();
                this.library.addBook(book);
            },
            findBook : function (id) {
                this.initializeLibrary();
                return this.library.findBook(id);
            },
            checkoutBook : function (id) {
                this.initializeLibrary();
                return this.library.checkoutBook(id);
            },
            returnBook : function (book) {
                this.initializeLibrary();
                rthis.library.returnBook(book);
            }
        };

        // 测试数据
        // 实例化代理对象，此时只是实例化了代理对象，并没有具体的本体对象
        var proxy = new LibraryProxy({
                '01' : new Book('01', 'java', 'z3'),
                '02' : new Book('02', 'html', 'z4')
        });

        // 在具体到方法的时候，才会实例化出本体对象
        //alert(proxy.findBook('01').title);
		var res = {"status":'ok','url':'dsdds'};
		res = res.toJSONString();
		alert(res);

    </script>
</head>
<body>

</body>
</html>